home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Science⁄Math / Scientist's Helper src / s.helper.5 / regtable.c < prev    next >
C/C++ Source or Header  |  1986-02-06  |  7KB  |  291 lines

  1. #include "all.h"
  2. #include "regtabext.h"
  3.  
  4. InitTable() /*to be called once at beginning of program*/
  5. {
  6.     int i, j;
  7.     for (i=0; i<32; i++ ) {
  8.         table.ptr[i] = NULL;
  9.         } /*end for*/
  10.     strcpy(table.header.title,"");
  11.     table.header.samp = 1.0;
  12.     table.header.start = 0.0;
  13.     table.header.interpolated = FALSE;
  14.     AllocTable( 128, 2 );
  15.     strcpy(table.header.title,"Untitled Table");
  16.     table.header.samp = 1.0;
  17.     table.header.start = 0.0;
  18.     table.header.interpolated = FALSE;
  19.     Header2Vars();
  20. }
  21.  
  22. AllocTable( r, c ) /*allocates table on heap*/
  23. int r, c;
  24. {
  25.     int i,j, blocks, error, status;
  26.     char str[32];
  27.  
  28.     if ( (r<1) || (r>4096) ) {
  29.         ErrMsg("rows out of range 1-4096");
  30.         }
  31.     if ( (c<1) || (c>32) ) {
  32.         ErrMsg("cols out of range 1-32");
  33.         }
  34.     for (i=0; i<32; i++) {  /*release memory used by previous table*/
  35.         if( table.ptr[i] != NULL ) {
  36.             DisposHandle( table.ptr[i] );
  37.             table.ptr[i] = NULL;
  38.             } /*end if*/
  39.         } /*end for*/
  40.     error = FALSE;
  41.     for ( i=0; i<c; i++ ) { /*capture new memory*/
  42.         table.ptr[i] = NewHandle((long)r*4L);
  43.         if (MemError()!=noErr){                   
  44.             error = TRUE;
  45.             break;
  46.             }/*end if*/
  47.         }/*for*/
  48.     if( !error ) {
  49.         table.header.rows = r;
  50.         table.header.cols = c;
  51.         table.header.maxRows  = r;
  52.         table.header.maxCols  = c;
  53.         for ( i=1; i<=c; i++ ) { /*initialize column names*/
  54.             IToS( i, str );
  55.             strcpy( table.header.colName[i-1], "Col " );
  56.             strcat( table.header.colName[i-1], str);
  57.             } /*end for */
  58.         for ( i=1; i<=r; i++ ) { /*initialize table values*/
  59.         for ( j=1; j<=c; j++ ) {
  60.             SetTable( i, j, infinity, TRUE );
  61.             } } /*end fors*/
  62.         CreateCol1();
  63.         Header2Vars();
  64.         WritePhrase("new table ");
  65.         IToS( r, str );
  66.         WritePhrase(str);
  67.         WritePhrase(" by ");
  68.         IToS( c, str );
  69.         WriteLine( str );
  70.         }
  71.     else if ( error && (r==128) && (c==2) ) {
  72.         WriteLine("Fatal error. no space for minimum table");
  73.         doneFlag = TRUE;
  74.         }      
  75.     else {
  76.         ErrMsg("not enough space. Try a smaller table");
  77.          AllocTable( 128, 2 );
  78.         }
  79. }
  80.   
  81.        
  82. SetTable( r, c, value, override)
  83. int r, c, override;
  84. float value;
  85. /* sets table to given value unless entry in row 1 and table is interpolated*/
  86. /* override=TRUE overrides this exception*/
  87. {
  88.     int i,j, block, offset;
  89.     char str[80];
  90.     
  91.     if( (r<1) || (r>table.header.rows) ) {
  92.         IToS( r, str );
  93.         strcat( str, " cant set row outside table" );
  94.         ErrMsg(str);
  95.         }
  96.     else if( (c<1) || (c>table.header.cols) ) {
  97.         IToS( c, str );
  98.         strcat( str, " cant set col outside table" );
  99.         ErrMsg(str);
  100.         }
  101.     else if( (table.header.interpolated) && (c==1) && (!override) ) {
  102.         ErrMsg("cant change col 1 of interpolated table");
  103.         }
  104.     (**table.ptr[c-1])[r-1] = value;
  105.     }
  106.  
  107. GetTable( r, c, f ) /*gets table entry*/
  108. int r, c;
  109. float *f;
  110. {
  111.     int i,j, block, offset;
  112.     char str[80];
  113.             
  114.     if ( (r<1) || (r>table.header.rows) ) {                   
  115.         IToS( r, str );
  116.         strcat( str, " cant get row outside table");
  117.         ErrMsg(str);
  118.         }
  119.     if ( (c<1) || (c>table.header.cols) ) {                   
  120.         IToS( c, str );
  121.         strcat( str, " cant get col outside table");
  122.         ErrMsg(str);
  123.         }
  124.     *f = (**table.ptr[c-1])[r-1];
  125. }
  126. ReadTable(reply)
  127. SFReply *reply;
  128. {
  129.     char        str[256];
  130.     int        i, j, k, firstCol, f, oldMaxRows, oldMaxCols;
  131.     long        regTabType, count, bytes;
  132.     Finfo     info;
  133.     
  134.     if( !(reply->good) ) {
  135.         return;
  136.         }
  137.     
  138.     strncpy( (char*)(®TabType), "RGTB", 4 );
  139.  
  140.     oldMaxRows  = table.header.maxRows;
  141.     oldMaxCols  = table.header.maxCols;
  142.     
  143.     if( GetFInfo( reply->fName, reply->vRefNum, &info )!=noErr ) {
  144.         ErrMsg("couldnt get file info");
  145.         }
  146.     if(  info.fdType!=regTabType ) {
  147.         ErrMsg("not a RegTab file");
  148.         }
  149.  
  150.     /*open file*/
  151.     
  152.     if( FSOpen( reply->fName, reply->vRefNum, &f)!=noErr ) {
  153.         ErrMsg("couldnt open file");
  154.         }
  155.     SetFPos( f, fsFromStart, 0L );
  156.     count=512L;
  157.     k=FSRead(f,&count,&(table.header));
  158.     if( (k!=noErr) || (count!=512L) ) {
  159.         FSClose(f);
  160.         ErrMsg("couldnt read header");
  161.         }
  162.     if ( (table.header.rows<1) || (table.header.rows>4096)
  163.          || (table.header.cols<1) || (table.header.cols>32) ) {                   
  164.         FSClose(f);
  165.         ErrMsg("table header is incorrect");
  166.         }
  167.         
  168.     /* case more space is needed, allocate it and try again*/
  169.     if( (oldMaxRows<(table.header.rows)) || (oldMaxCols<table.header.cols) ) {
  170.         FSClose(f);
  171.         AllocTable( table.header.rows, table.header.cols );
  172.         WriteLine("Warning: table allocation changed");
  173.         ReadTable(reply);
  174.         }
  175.     else {
  176.         table.header.maxCols = oldMaxCols;
  177.         table.header.maxRows = oldMaxRows;
  178.         for( i=(table.header.cols+1); i<=table.header.maxCols; i++ )   { 
  179.             strcpy( table.header.colName[i-1], "Col " );
  180.             IToS( i, str );
  181.             strcat( table.header.colName[i-1], str );
  182.             }
  183.         if (table.header.interpolated) {
  184.             firstCol=1;
  185.             }
  186.         else {
  187.             firstCol=0;
  188.             }
  189.             
  190.         bytes = (long)table.header.rows*4L;
  191.         for( j=firstCol; j<table.header.cols; j++ ) {
  192.             HLock(table.ptr[j]);
  193.             count = bytes;
  194.             k=FSRead(f,&count,*(table.ptr[j]));
  195.             HUnlock(table.ptr[j]);
  196.             if( (k!=noErr) || (count!=bytes) ) {
  197.                 FSClose(f);
  198.                 ErrMsg("couldnt read table");
  199.                 }
  200.             } /*end for*/
  201.         FSClose(f);
  202.         CreateCol1();
  203.         RedoEditWindow();
  204.         Header2Vars();
  205.         Header2Vars();
  206.         }
  207. }
  208.  
  209.  
  210. WriteTable(reply)
  211. SFReply *reply;
  212. {
  213.     int f, i, j, k, firstCol;
  214.     char str[256];
  215.     long count, bytes, bytesNeeded, bytesAvailable, regTabType, t;
  216.     Finfo info;
  217.     
  218.     if( !(reply->good) ) {
  219.         return;
  220.         }
  221.  
  222.     strncpy( ®TabType, "RGTB", 4 );
  223.     
  224.     if( GetFInfo( reply->fName, reply->vRefNum, &info )==noErr ) { /*delete old file, if any*/
  225.         if(  info.fdType!=regTabType ) {
  226.             ErrMsg("cant overwrite a non-RegTab file");
  227.             }
  228.         else {
  229.             if( FSDelete(reply->fName, reply->vRefNum)!=noErr ) {
  230.                 ErrMsg("couldnt delete existing file");
  231.                 }
  232.             }
  233.         }
  234.         
  235.     if (table.header.interpolated) {
  236.         firstCol=1;
  237.         }
  238.     else {
  239.         firstCol=0;
  240.         }
  241.         
  242.     bytesNeeded = 512L + ( 4L * (long)table.header.rows * (long)(table.header.cols-firstCol) );
  243.     bytesAvailable = 0;
  244.     for( i=0; i<10; i++ ) {
  245.         k=GetVInfo( i, str, &j, &count );
  246.         if( (k==noErr) && (j==reply->vRefNum) ) {
  247.             bytesAvailable=count;
  248.             break;
  249.             }
  250.         }
  251.     if( bytesAvailable<bytesNeeded ) {
  252.         ErrMsg( "not enough space on disk" );
  253.         }
  254.         
  255.     if( Create(reply->fName, reply->vRefNum, regTabType, regTabType)!=noErr ) {
  256.         ErrMsg("couldnt create file");
  257.         }
  258.         
  259.     if( FSOpen(reply->fName, reply->vRefNum, &f )!=noErr ) {
  260.         ErrMsg("couldnt open file");
  261.         }
  262.  
  263.     if( SetFPos( f, fsFromStart, 0L )!=noErr ) {
  264.         ErrMsg("couldnt find beginning of file");
  265.         }
  266.  
  267.     count=512L;
  268.     k = FSWrite(f, &count, &(table.header) );
  269.     if( (k!=noErr) || (count!=512L) ) {
  270.         FSClose(f);
  271.         ErrMsg("couldnt write header");
  272.         }
  273.         
  274.     bytes = (long)table.header.rows * 4L;
  275.     for( j=firstCol; j<table.header.cols; j++) {
  276.         HLock(table.ptr[j]);
  277.         count=bytes;
  278.         k =FSWrite(f, &count, *(table.ptr[j]) );
  279.         HUnlock(table.ptr[j]);
  280.         if( (k!=noErr) || (count!=bytes) ) {
  281.             FSClose(f);
  282.             ErrMsg("couldnt write table");
  283.             }
  284.         } /*end fors*/
  285.         
  286.     if( FSClose(f)!=noErr ) {
  287.         ErrMsg("couldnt close file");
  288.         }
  289.     FlushVol( str, reply->vRefNum );
  290. }
  291.